module variables
	implicit none
	real(kind=8),dimension(:),allocatable::fibo1,errelativo1,fibo2,errelativo2	
end module variables


program ejercicio3

use variables, only: fibo1=>fibo1, errelativo1=>errelativo1, fibo2=>fibo2, errelativo2=>errelativo2
implicit none

real(kind=8), parameter:: maximo = (1._8+(sqrt(5._8)))/2._8
real(kind=8), parameter:: fi = (1._8-(sqrt(5._8)))/2._8
integer(kind=8)::num = 0
integer(kind=8)::i = 0
integer::n,testeo



print*
print*,' Introduzca el numero del que quiere realizar la sucesión: '
read*,num
n = num
allocate(fibo1(n))
allocate(errelativo1(n),stat=testeo)
allocate(fibo2(n))
allocate(errelativo2(n),stat=testeo)
if (testeo /=0) print*, 'errelativo1 en el array de datos'


if ((num <0) .or. (num >100)) then 
	print*, '-errelativo1, es un numero negativo o se sale del rango.-'
else    
	do i=1,num,1
		fibo1(i) = fib(i+1)/fib(i)
		
		errelativo1(i)= abs(relativo(fibo1(i)))
		
	end do
	do i=1,num,1
		fibo2(i)= fibb(i+1)/fibb(i)	
		errelativo2(i)= abs(relativo2(fibo2(i)))
	end do
end if
 call escribe


contains

	function relativo(numero) result(res2)
	real(kind=8)::numero
	real(kind=8)::res2
		res2=(numero - maximo)/maximo	
	end function relativo

	function relativo2(numero) result(res4)
	real(kind=8)::numero
	real(kind=8)::res4
		res4=(numero - maximo)/maximo
	end function relativo2

 function fib(n) result(res)
	implicit none
	integer(kind=8)::i
	integer(kind=8),intent(in)::n
	real(kind=8)::res,a,b
	a=0._8
	b=1._8
	res=a+b
	do i=3,n,1
		a=b
		b=res
		res=a+b
	end do
end function fib

	function fibb(numero) result(res3)
		integer(kind=8), intent(in)::numero
		real(kind=8) :: res3
		if (numero == 1) then 
			res3 = 1._8
		else
			res3=(1/sqrt(5._8))*(maximo**numero-fi**numero)
		end if
	end function fibb

	subroutine escribe	
		use variables
		integer(kind=8)::j
		open(unit=1, file='resultados.dat',status='unknown')
		open(unit=2, file='resultados2.dat',status='unknown')

		do j=1,num,1
			write(1,'(i4)')j
			write(1,'(f16.14)')fibo1(j)
			write(1,'(e22.15)')errelativo1(j)	
		end do
			
		do j=1,num,1
			write(2,'(i4)')j
			write(2,'(f16.14)')fibo2(j)
			write(2,'(e22.15)')errelativo2(j)		
		end do

		close(1)
		close(2)
	end subroutine escribe



end program
